<?php
class InstallAction extends BaseAction
{


    /* 安装
     *
     */
    public function index()
    {
        // 定义标题、样式表
        echo '<title>安装 - Remote MySQL</title>';
        echo '<link rel="stylesheet" type="text/css" href="' . __APP_PUBLIC__ . '/css/public.css" />';
        // 获取表前缀
        $db_prefix = C('DB_PREFIX');
        // 获取数据库连接
        $db_conf_main = $this->get_db_config();
        $db_conf_host = $this->get_db_config('original');
        // 检查安装锁
        $lock = getcwd() . DIRECTORY_SEPARATOR . 'install.lock';
        if( file_exists($lock) )
        {
            $this->show_msg('error', '已完成安装，请勿重复操作。', 0);
            $this->show_msg('error', '若要重新安装，请删除站点根目录下的install.lock，然后刷新页面。', 0);
            die();
        }
		// 检查事件调度器
		$query = "SHOW VARIABLES LIKE 'event_scheduler'";
		$check_event_scheduler = $this->check_event_scheduler();
		if(!$check_event_scheduler)
		{
			$this->show_msg('error', '事件调度器(Event Scheduler)未开启，请修改配置文件后重启MySQL，并刷新页面重新安装', 0);
            die();
		}
		// 检查数据库
        $db_name = C('DB_NAME');
        $check_db_res = $this->check_db_exist($db_name);
        if($check_db_res)
        {
            // 清理数据库
            $this->assign('db_name', $db_name);
            $this->display('confirm_del_db');
            die();
        }
        // 定义建表顺序
        $make_install = array(
            'user',
			'invite_record',
            'operation_log',
			'log'
        );
        // 新建数据库
        $query = 'CREATE DATABASE `' . $db_name . '` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci';
        $new_db = M('', '', $db_conf_host)->execute($query);
        if(!$new_db)
        {
            $this->show_msg('error', '新建数据库失败', 1);
        }
        // 选择数据库
        $query = 'use ' . $db_name . ';';
        M('', '', $db_conf_host)->execute($query);
        // 执行安装
        foreach($make_install as $m=>$n)
        {
            $func = 'create_' . $n . '_table';
            $res = $this->$func();
            if(!$res['status'])
            {
                $this->show_msg('error', $res['err_msg']);
                die();
            }
            $this->show_msg('success', $res['err_msg']);
        }
        $this->show_msg('success', '安装完成', 2);
        $this->show_msg('success', '请稍候，页面正在跳转，初次使用请添加用户', 0);
        $this->show_msg('success', '', 3);
        // 生成安装锁
        $this->make_install_lock();
        // 生成临时session（用于首次添加用户）
        $_SESSION = array();
        $_SESSION['install'] = 1;
        U('Users/add_user', '', '', 1);
    }


    /* 删除数据库
     *
     */
    public function del_db()
    {
        // 定义标题、样式表
        echo '<title>删除数据库 - Remote MySQL</title>';
        echo '<link rel="stylesheet" type="text/css" href="' . __APP_PUBLIC__ . '/css/public.css" />';
		// 获取操作类型
        $act = intval($_GET['act']);
        if(!$act)
        {
            $this->show_msg('error', '未删除数据库，已退出安装', 0);
        }
        else
        {
			// 检查安装锁
	        $lock = getcwd() . DIRECTORY_SEPARATOR . 'install.lock';
	        if( file_exists($lock) )
	        {
	            $this->show_msg('error', '已完成安装，请勿重复操作。', 0);
	            $this->show_msg('error', '若要重新安装，请删除站点根目录下的install.lock，然后刷新页面。', 0);
	            die();
	        }
            // 库名
            $db_name = C('DB_NAME');
            // 数据库链接
            $db_conf_host = $this->get_db_config('original');
            // 删库
            $this->show_msg('success', '正在执行清理工作', 0);
            $query = 'DROP DATABASE ' . $db_name . ';';
            M('', '', $db_conf_host)->execute($query);
            // 检查是否删除成功
            $check_del_db = $this->check_db_exist($db_name);
            if(!$check_del_db)
            {
                $this->show_msg('success', '清理完成', 1);
                $this->show_msg('success', '', 1);
                // 清理SESSION
                session_unset();
                session_destroy();
                // 重启安装流程
                U('Install/index', '', '', 1);
            }
            else
            {
                $this->show_msg('error', '删除数据库失败，安装已终止', 1);
            }
        }
    }


    /* 检查数据库是否存在
     *
     */
    private function check_db_exist($db_name)
    {
        // 数据库链接
        $db_conf_host = $this->get_db_config('original');
        // 获取数据库名
        $db_name = strval( trim($db_name) );
        if(!$db_name)
        {
            return 0;
        }
        $query = 'SHOW DATABASES';
        $db_list = M('', '', $db_conf_host)->query($query);
        $db_list = array_column($db_list, 'Database');
        $check_db_res = array_search($db_name, $db_list);
        if($check_db_res)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }


    /* 新建用户表
     *
     */
    private function create_user_table()
    {
        // 预定义返回数据
        $res['status'] = '0';
        $res['err_msg'] = '';

        $db_prefix = C('DB_PREFIX');
        $db_conf_main = $this->get_db_config();
        $query = "
            CREATE TABLE `" . $db_prefix . "users` (
                `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID，自增',
                `user_name` varchar(50) NOT NULL COMMENT '用户名',
                `password` varchar(50) NOT NULL COMMENT '密码',
                `power` tinyint(3) UNSIGNED NOT NULL COMMENT '等级（1为管理员）',
                `nickname` varchar(50) NOT NULL COMMENT '昵称',
				`register_time` varchar(20) NOT NULL COMMENT '注册时间',
				`useable` tinyint(3) UNSIGNED NOT NULL COMMENT '是否可用（0-不可用；1-可用）',
                PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
        ";
        $execute_res = M('', '', $db_conf_main)->execute($query);
        if($execute_res === FALSE)
        {
            $res['err_msg'] = '新建用户表失败';
            return $res;
            die();
        }

        $res['status'] = '1';
        $res['err_msg'] = '新建用户表成功';
        return $res;
    }


	/* 新建邀请记录表
     *
     */
    private function create_invite_record_table()
    {
        // 预定义返回数据
        $res['status'] = '0';
        $res['err_msg'] = '';

        $db_prefix = C('DB_PREFIX');
        $db_conf_main = $this->get_db_config();
        $query = "
            CREATE TABLE `" . $db_prefix . "invite_record` (
                `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID，自增',
				`invite_code` varchar(32) NOT NULL COMMENT '邀请码',
				`nickname` varchar(50) NOT NULL COMMENT '昵称',
				`add_time` varchar(20) NOT NULL COMMENT '添加时间',
				`status` tinyint(3) UNSIGNED NOT NULL COMMENT '使用状态（0：不可用；1：可用；2：已用）',
                PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='邀请记录表';
        ";
        $execute_res = M('', '', $db_conf_main)->execute($query);
        if($execute_res === FALSE)
        {
            $res['err_msg'] = '新建邀请记录表失败';
            return $res;
            die();
        }

        $res['status'] = '1';
        $res['err_msg'] = '新建邀请记录表成功';
        return $res;
    }


    /* 新建操作日志表
     *
     */
    private function create_operation_log_table()
    {
        // 预定义返回数据
        $res['status'] = '0';
        $res['err_msg'] = '';

        $db_prefix = C('DB_PREFIX');
        $db_conf_main = $this->get_db_config();
        $query = "
            CREATE TABLE `" . $db_prefix . "operation_log` (
                `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID，自增',
				`user_id` int(10) UNSIGNED NOT NULL COMMENT '用户ID',
                `add_time` varchar(20) NOT NULL COMMENT '添加时间',
                `contents` varchar(255) NOT NULL COMMENT '日志内容',
                PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='操作日志表';
        ";
        $execute_res = M('', '', $db_conf_main)->execute($query);
        if($execute_res === FALSE)
        {
            $res['err_msg'] = '新建操作日志表失败';
            return $res;
            die();
        }

        $res['status'] = '1';
        $res['err_msg'] = '新建操作日志表成功';
        return $res;
    }


    /* 新建日志表（调试用）
     *
     */
    private function create_log_table()
    {
        // 预定义返回数据
        $res['status'] = '0';
        $res['err_msg'] = '';

        $db_prefix = C('DB_PREFIX');
        $db_conf_main = $this->get_db_config();
        $query = "
            CREATE TABLE `" . $db_prefix . "log` (
                `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT  COMMENT '主键ID，自增',
                `get` text NOT NULL COMMENT 'GET数据',
                `post` text NOT NULL COMMENT 'POST数据',
                `custom` text NOT NULL COMMENT '自定义数据',
                PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='日志表（调试用）';
        ";
        $execute_res = M('', '', $db_conf_main)->execute($query);
        if($execute_res === FALSE)
        {
            $res['err_msg'] = '新建日志表失败';
            return $res;
            die();
        }

        $res['status'] = '1';
        $res['err_msg'] = '新建日志表成功';
        return $res;
    }


    /* 生成安装锁
     *
     */
    private function make_install_lock()
    {
        $contents_arr = array(
            '操作系统' => php_uname(),
            'PHP版本' => PHP_VERSION,
            '编译引擎' => $_SERVER['SERVER_SOFTWARE'],
            '安装时间' => date('Y-m-d H:i:s', time())
        );
        foreach($contents_arr as $m=>$n)
        {
            $contents .= $m . '： ' . $n . PHP_EOL;
        }
        $contents = trim($contents);

        $fp = fopen('install.lock', 'w');
        fwrite($fp, $contents);
        fclose($fp);
    }


}
